#ifndef DATA_COLLECTOR_H
#define DATA_COLLECTOR_H

#include "node-manager.h" // 包含NodeType定义
#include "ns3/core-module.h"
#include <string>
#include <vector>
#include <map>
#include <fstream>

namespace ns3 {

// 定义结果结构体 - 扩展以包含更多车辆和网络数据
struct ChannelAllocationResult {
    uint32_t nodeId;          // 节点ID
    std::string vehicleId;    // 车辆ID (对应SUMO车辆ID)
    double time;              // 仿真时间
    double x;                 // 车辆X坐标
    double y;                 // 车辆Y坐标
    double z;                 // 车辆Z坐标
    double speed;             // 车辆速度
    int channelId;            // 分配的信道ID
    uint32_t connectedNodeId; // 连接的节点ID (基站或卫星)
    NodeType connectedNodeType; // 连接节点类型
    double sinr;              // 信噪比
    double throughput;        // 吞吐量
    double delay;             // 延迟
    double interference;      // 干扰
    double pathLoss;          // 路径损耗
};

class DataCollector
{
public:
    DataCollector();
    virtual ~DataCollector();
    
    // 设置仿真参数
    void SetSimulationTimeStep(double timeStep); // 设置仿真步长
    void SetOutputDirectory(const std::string& directory); // 设置输出目录
    
    // 启用数据收集
    void EnableThroughputCollection();
    void EnableDelayCollection();
    void EnableInterferenceCollection();
    void EnablePathLossCollection();
    
    // 记录信道分配结果
    void RecordAllocationResult(const ChannelAllocationResult& result);
    
    // 保存聚合结果
    void SaveResults(const std::string& filePath);
    
    // 按车辆生成并保存类似SUMO格式的文件
    void SaveVehicleResults(); 
    
    // 在特定时间点触发的事件 - 用于周期性数据收集
    void CollectDataAtTime(double time);
    
    // 开始周期性数据收集
    void StartPeriodicCollection(double startTime, double endTime);

    /**
     * 启用实时日志记录
     * @param enable 是否启用
     * @param frequency 日志频率（秒）
     */
    void EnableRealTimeLogging(bool enable, int frequency);
    
    /**
     * 记录并打印性能指标
     * 在每次数据收集后调用此方法显示实时性能结果
     */
    void LogPerformanceMetrics();
    
private:
    // 创建输出目录
    void EnsureOutputDirectoryExists();
    
    // 按车辆ID组织输出文件
    std::map<std::string, std::ofstream> m_vehicleOutputFiles;
    
private:
    // 修改成员变量声明顺序，确保初始化顺序一致
    bool m_realTimeLoggingEnabled; // 是否启用实时日志
    int m_loggingFrequency; // 日志频率
    Time m_lastLogTime; // 上次记录日志的时间
    
    // 其他已有成员变量
    bool m_collectThroughput;
    bool m_collectDelay;
    bool m_collectInterference;
    bool m_collectPathLoss;
    
    double m_timeStep; // 仿真时间步长
    std::string m_outputDirectory; // 输出目录
    
    // 存储信道分配结果 - 按时间和车辆ID组织
    std::map<double, std::map<std::string, ChannelAllocationResult>> m_timeVehicleResults;

    // 实时日志调度器
    void ScheduleNextLog();
    void DoLogPerformance();
    
    // 添加 WriteCSVHeader 声明
    void WriteCSVHeader(std::ofstream& file);
};

} // namespace ns3

#endif /* DATA_COLLECTOR_H */
